package com.tedu.API.IO;

import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.RandomAccess;

/**
 * 解决：File无法实现读写操作
 *
 * RandomAccessFile类   随机访问文件类
 * 功能：实现"文件"，文件夹的读写操作,底层使用c语言，底层：二进制数据
 * 创建随机访问文件类
 * RandomAccessFile raf=new RandomAccessFile("路径+全称","rw");
 * RandomAccessFile raf=new RandomAccessFile("路径+全称","r");
 *   第二个参数[mode 模式]：r 模式--->该文件可以读操作
 *                       rw 模式 ---->该文件可以读写操作
 *
 * 需求：实现CV 复制音乐或者视频
 */
public class RandomAccessFileAPI {
    @Test
    public void testRAF() throws IOException {
        //RandomAccessFile对象创建出来---路径+全称  | 模式 ：“rw”
        RandomAccessFile raf=
                new RandomAccessFile("raf.txt","rw");
        //1.在API 项目文件夹下 创建 raf.txt 文件，并且实现读写操作

        //计算机 识别：二进制 0000 0000
        /**
         * 需要往 raf.txt 写出一个a 字母
         * write(整数:)
         *       范围：0~~255   ASCII码  二进制---十进制---字母
         * 作用：往文件中写出一个字节 ，抛出IO流的异常：存在写出失败情况
         *      整数的第八位写出文件中
         *      1字节==8位二进制 0000 0001
         *                     0000 0010
         *                     0000 0011
         *      1024字节==1kb
         *
         */
        raf.write(97);
        raf.write(98);
        raf.write(98);
        //write()方法---一个一个字节写出
        //关闭流  close()
        raf.close();
    }

    /**
     * read()
     * 作用：读取一个字节，返回十进制的int类型返回。如果文件读到-1，代表结束
     *      存在IO流异常：读取可能失败异常~
     */
    @Test
    public void testRead() throws IOException {
        //创建对象：随机访问文件的对象--只读---raf.txt文件的内容
        RandomAccessFile raf=
                new RandomAccessFile("raf.txt","r");
        int i=raf.read();
        int j=raf.read();
        int k=raf.read();
        System.out.println(""+i);

    }

    /**
     * RAF类--读写操作-
     *         --write(数值) read() 一个字节的写出以及读入
     * 需求：复制粘贴一个音乐 【version--不考虑效率】
     */
    @Test
    public void testCV() throws IOException {
        //1.原文件--“小跳蛙.mp3” --复制--操作：读入
        RandomAccessFile src=new RandomAccessFile("小跳蛙.mp3","r");
        //2.复制文件---“新跳蛙.mp3”   --粘贴--写出--
            RandomAccessFile desc=
                    new RandomAccessFile("新跳蛙.mp3","rw");
        //3.用于保存读取的字节：保存一个字节 -1代表文件读取到末尾
        int data=-1;
        //4.一直  从小跳蛙.mp3 中一个字节一个字节读取----写出
        //    同时一个字节一个字节的写出文件“新跳蛙.mp3”
        // (data=src.read())!=-1 条件判断语句
        long startTime=System.currentTimeMillis();//获取到当前时间毫秒数
        while((data=src.read())!=-1){
            //同时一个字节一个字节写出新跳蛙
            desc.write(data);
        }
        long endTime=System.currentTimeMillis();
        System.out.println("复制粘贴花费的时间"+(endTime-startTime)+"毫秒");

    }

    /**
     * RAF类--读写操作-
     * 一个字节一个字节写出慢
     * 100kb读取---100kb写出【快】
     *
     */
    @Test
    public void testCVS() throws IOException {
        //1.从小跳蛙.mp3 --读取数据【100kb】
        RandomAccessFile raf=new RandomAccessFile("小跳蛙.mp3","r");
        //2.从API目录下写出：“效率高.mp3”  ---efficiency
        RandomAccessFile effi=
                new RandomAccessFile("efficiency.mp3","rw");
        //3.定义一个中间量 middle   1>覆盖：保存读写数据  2>没有数据表示文件读取到末尾
        int middle=-1;
        //4.efficiency 效率：100kb  字节数组: byte
        byte[] date=new byte[1024*100];  //100kb
        //5.一直 从raf文件中100kb读取数据 | read(byte[] b) 读取100kb
        //5.1 raf.read()  从 raf 一个一个字节读取
        //5.2 raf.read( byte[] date) 从raf100kb读取
        //5.3 middle=raf.read(byte[] date)  保存数据
        //5.4 (middle=raf.read(byte[] date))!=-1
        long timeStart=System.currentTimeMillis(); //开始时间
        while((middle=raf.read(date))!=-1){
            //同时,读的同时，写出数据
            //write(整数)慢
            //write(字节数组,0,-1)  写出字节数组指定的单位量【100kb】
            effi.write(date,0,middle);
        }
        long timeEnd=System.currentTimeMillis();  //结束时间
        System.out.println("efficiency总时间"+(timeEnd-timeStart));

        //复制视频
        RandomAccessFile beforeVideo=
                new RandomAccessFile("复制使用.mp4","r");
        RandomAccessFile afterVideo=
                new RandomAccessFile("afterVideo.mp4","rw");

        //定义中间量
        int middleVideo=-1;
        byte[] bVideo=new byte[1024*1024];
        long startTime=System.currentTimeMillis();
        while ((middleVideo=beforeVideo.read(bVideo))!=-1){

            afterVideo.write(bVideo,0,middleVideo);
        }
        long endTime=System.currentTimeMillis();
        System.out.println("视频运行时间"+(endTime-startTime));
        raf.close();
    }
}
